/**
 * 事件订阅与发布者模块
 */
var event_mgr = {
    /**
     * 事件映射表
     * 事件名: [订阅者1，订阅者2，订阅者3...{caller,func}]
     */
    events_map: {

    },

    init() {
        cc.log("== event_mgr init ==");
    },

    /**
     * 注册订阅事件
     * @param {*} event_name  事件名字
     * @param {*} caller  事件调用的this
     * @param {*} func 事件回调函数
     */
    add_event_listenenr(event_name, caller, func) {
        if (!this.events_map[event_name]) {
            this.events_map[event_name] = [];
        }
        var event_queue = this.events_map[event_name];
        event_queue.push({
            caller: caller,
            func: func,
        })
    },

    /**
     * 移除订阅事件
     * @param {*} event_name  事件名字
     * @param {*} caller  事件调用的this
     * @param {*} func 事件回调函数
     */
    remove_event_listener(event_name, caller, func) {
        if (!this.events_map[event_name]) {
            return;
        }
        var event_queue = this.events_map[event_name];
        for (let i = 0; i < event_queue.length; i++) {
            var obj = event_queue[i];
            if (obj.caller === caller && obj.func === func) {
                event_queue.splice(i, 1);
                break;
            }
        }

        if (event_queue.length <= 0) {
            cc.log("=====remove_event_listener=======", event_name);
            this.events_map[event_name] = null;
        }
    },

    /**
     * 发送事件
     * @param {*} event_name 事件名字 
     * @param {*} udata 数据
     */
    dispatch_event(event_name, udata) {
        if (!this.events_map[event_name]) {
            return;
        }
        var event_queue = this.events_map[event_name];
        for (let i = 0; i < event_queue.length; i++) {
            var obj = event_queue[i];
            obj.func.call(obj.caller, event_name, udata);
        }
    },
}
module.exports = event_mgr;